# 导入请求库
import requests
# 导入数据解析模块
import parsel
# 导入正则表达式模块
import re
# 导入文件操作模块
import os

# 导入线程池
import concurrent.futures


def get_response(url):
    """
    发送请求函数
    :param url: 请求链接
    :return: 返回响应数据
    """
    # 模拟浏览器
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'
    }
    response = requests.get(url=url, headers=headers)
    return response


def get_list_url(url):
    """
    获取章节链接函数
    :param url: 小说目录页面链接
    :return: 返回章节链接列表
    """
    # 调用发送请求函数
    html_data = get_response(url).text
    # print(html_data)
    # 提取小说名
    name = re.findall('<h1>(.*?)</h1>', html_data)[0]
    # 提取章节
    url_list = re.findall('<dd><a href ="(.*?)">', html_data)
    return name, url_list


def get_content(url):
    print(url)
    """
    获取章节内容函数
    :param url: 章节链接
    :return: 返回章节内容
    """

    """
       【re正则表达式：直接对字符串解析】
       .*? 可以匹配任意数据，除了\n换行符

       # 提取标题
       title = re.findall('<h1 class="wap_none">(.*?)</h1>', response.text)[0]
       # 提取内容
       content = \
           re.findall('<div id="chaptercontent" class="Readarea ReadAjax_content">(.*?)<p class="readinline">', response.text,
                      re.S)[0].replace('<br /><br />', '\n')
                      
    get() 提取第一个标签数据内容，返回字符串
    getall() 提取多个返回列表


    selector = parsel.Selector(text=response.text)
    title = selector.css('.content h1::text').get()
    print(title)
    content = '\n'.join(selector.css('#chaptercontent::text').getall())
    # print(content)

    """
    try:
        # 调用发送请求函数
        html_data = get_response(url).text
        # 提取标题
        title = re.findall('<h1 class="wap_none">(.*?)</h1>', html_data)[0]
        # 提取内容
        content = \
            re.findall('<div id="chaptercontent" class="Readarea ReadAjax_content">(.*?)<p class="readinline">',
                       html_data,
                       re.S)[0].replace('<br /><br />', '\n')
    except:
        pass
    finally:
        return title, content


def save(name, title, content):
    """
    保存数据函数，全本下载
    :param name: 小说名
    :param title: 章节名
    :param content: 章节内容
    :return:
    """
    # 自动创建文件夹
    file = f'{name}'
    print("Checking if file exists:", file)
    if not os.path.exists(file):
        print("Creating directory:", file)
        os.mkdir(file)
    # 保存
    with open(file + '/' + name + '.txt', 'a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')
    print(title, '已经保存')


def save_by_category(name, title, content):
    """
    保存数据函数，全本下载
    :param name: 小说名
    :param title: 章节名
    :param content: 章节内容
    :return:
    """
    # 自动创建文件夹
    file = f'{name}'
    if not os.path.exists(file):
        os.mkdir(file)
    # 保存
    with open(file + '/' + title + '.txt', 'a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')
    print(title, '已经保存')


def main(home_url):
    title, content = get_content(url=home_url)
    save(name, title, content)
    # save_by_category(name, title, content)


def get_novel_id(url):
    """
    获取小说id
    :param url: 某分类链接
    :return: 返回小说id
    """
    novel_data = get_list_url(url).text


# if __name__ == '__main__':
#     url = 'https://www.bqgda.cc/books/54153/'
#     # 1. 获取小说名，和章节链接
#     name, url_list = get_list_url(url=url)
#     exe = concurrent.futures.ThreadPoolExecutor(max_workers=5)
#     for url in url_list:
#         # 遍历所有章节拼接完整的链接
#         index_url = 'https://www.bqgda.cc' + url
#         # 线程池调用main方法,无法保证下载章节的顺序
#
#         exe.submit(main, index_url)
#     exe.shutdown()

if __name__ == '__main__':
    url = 'https://www.bqgda.cc/books/54153/'
    # 1. 获取小说名，和章节链接
    name, url_list = get_list_url(url=url)
    exe = concurrent.futures.ThreadPoolExecutor(max_workers=5)
    for url in url_list:
        # 遍历所有章节拼接完整的链接
        index_url = 'https://www.bqgda.cc' + url
        # 调用main方法
        main(index_url)
